/*
 * 例 3-3
 * 蛇形填数
 *
 * 在 n*n 矩阵里填入 1,2,...,n*n，
 * 要求填成蛇形。
 *
 * 样例输入：
 * 4
 * 样例输出：
 * 10 11 12 1
 * 9  16 13 2
 * 8  15 14 3
 * 7  6  5  4
 * （只检查输出数据的相对位置，
 * （格式不做严格要求。）
 */

#include <iostream>
#include <iomanip>
#include <fstream>
#define LOCAL
using namespace std;

const int LEN = 1000;
int matrix[LEN][LEN];
int main()
{
    int n;
#ifdef LOCAL
    ifstream cin("in.txt");
    ofstream cout("out.txt");
#endif
    while (cin >> n)
    {
        // 算法
        if (n == 1)
        {
            // 特殊边界处理
            cout << setw(3) << 1 << endl;
            continue;
        }
        int l, r, up, down, count = 0; // l,r,up,down 对应 左右上下
        r = down = n - 1;
        l = up = 0;
        while (l <= r && up <= down)
        {
            // 模仿填数过程
            for (int i = up; i <= down; ++i)
                matrix[i][r] = ++count;
            --r;
            for (int i = r; i >= l; --i)
                matrix[down][i] = ++count;
            --down;
            for (int i = down; i >= up; --i)
                matrix[i][l] = ++count;
            ++l;
            for (int i = l; i <= r; ++i)
                matrix[up][i] = ++count;
            ++up;
        }
        // 输出
        for (int i = 0; i < n; ++i)
        {
            for (int j = 0; j < n; ++j)
                cout << setw(3) << matrix[i][j];
            cout << endl;
        }
    }
    return 0;
}

// 课本答案
// #include <cstdio>
// #include <cstring>
// #define maxn 20
// int a[maxn][maxn];
// int main()
// {
//     // 输入
//     int n;
//     scanf("%d", &n);
//     // 算法
//     int x, y, tot = 0;             // 只用 x,y 控制转向
//     memset(a, 0, sizeof(a));       // 全部初始化为 0，可用来判断边界
//     tot = a[x = 0][y = n - 1] = 1; // 处理 n == 1
//     while (tot < n * n)
//     {
//         // 模拟填数过程
//         while (x + 1 < n && !a[x + 1][y])
//             a[++x][y] = ++tot;
//         while (y - 1 >= 0 && !a[x][y - 1])
//             a[x][--y] = ++tot;
//         while (x - 1 >= 0 && !a[x - 1][y])
//             a[--x][y] = ++tot;
//         while (y + 1 < n && !a[x][y + 1])
//             a[x][++y] = ++tot;
//     }
//     // 输出
//     for (x = 0; x < n; x++)
//     {
//         for (y = 0; y < n; y++)
//             printf("%3d", a[x][y]);
//         printf("\n");
//     }
//     return 0;
// }